// 此文件运行命令npm init @eslint/config生成
import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";
import pluginReact from "eslint-plugin-react";

/** @type {import('eslint').Linter.Config[]} */
export default [
  { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"] },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  pluginReact.configs.flat.recommended,
  {
    rules: {
      'object-curly-spacing': ['error', 'always'], // {}前后空格
      "template-curly-spacing": ["error", "always"],
      'comma-spacing': ['error', { before: false, after: true }], // 逗号后空格
      "key-spacing": ["error", { "beforeColon": false, "afterColon": true }], // 冒号后空格
      /** 可以出现any类型 */
      "@typescript-eslint/no-explicit-any": "off",
      /** 需要分号 */
      semi: ["error", "always"],
      /** 可以使用require */
      '@typescript-eslint/no-require-imports': 'off',
      /** 可以用ts-ignore */
      '@typescript-eslint/ban-ts-comment': 'off',
      /** 禁用 react/react-in-jsx-scope 规则 禁用不引入react导致报错 */
      'react/react-in-jsx-scope': 'off',
      /**
       * 不检查以下划线开头的 未使用的变量 
       * 包含了参数变量，解构变量，catch中的参数变量
      */
      '@typescript-eslint/no-unused-vars': ["error", { "argsIgnorePattern": "^_",
        "caughtErrorsIgnorePattern": "^_",
        "destructuredArrayIgnorePattern": "^_"  }],
      /** 配置代码缩进 */
      indent: ["error", 2, { 
        
        "SwitchCase": 1,
        //  case 语句块内的代码缩进 1 个单位。
        // switch (expr) {
        //   case 1:
        //     // 1 个单位缩进
        //     break;
        // }
       
        "VariableDeclarator": 1,
        // 立即执行函数表达式（IIFE）的外部主体缩进 1 个单位。
        // (function() {
        //   // 1 个单位缩进
        // })();
       
        "outerIIFEBody": 1, "MemberExpression": 1,
        // 成员表达式中的属性访问缩进 1 个单位。
        // const obj = {
        //   prop: {
        //     nested: 1
        //   }
        // };
        "FunctionDeclaration": { "parameters": 1, "body": 1 },
        // 函数声明中的参数和函数体分别缩进 1 个单位。
        // function foo(param1, param2) {
        //   // 1 个单位缩进
        // }
        "FunctionExpression": { "parameters": 1, "body": 1 },
        // 函数调用中的参数缩进 1 个单位。
        // someFunction(
        //   arg1,
        //   arg2
        // );
        "CallExpression": { "arguments": 1 },
        // 数组字面量中的元素缩进 1 个单位。
        // const arr = [
        //   1,
        //   2
        // ];
        "ArrayExpression": 1, "ObjectExpression": 1,
        // 对象字面量中的属性缩进 1 个单位。
        // const obj = {
        //   a: 1,
        //   b: 2
        // };
        "ImportDeclaration": 1,
        // 导入声明中的内容缩进 1 个单位。
        // import {
        //   a,
        //   b
        // } from 'module';
        "flatTernaryExpressions": false,
        // 是否将三元表达式的嵌套部分展平。设置为 false 表示不展平。
        "ignoredNodes": ["JSXElement", "JSXElement > *",
          "JSXAttribute",
          "JSXIdentifier",
          "JSXNamespacedName",
          "JSXMemberExpression",
          "JSXSpreadAttribute",
          "JSXExpressionContainer",
          "JSXOpeningElement",
          "JSXClosingElement",
          "JSXFragment",
          "JSXOpeningFragment",
          "JSXClosingFragment",
          "JSXText",
          "JSXEmptyExpression",
          "JSXSpreadChild"],
        "ignoreComments": false // ignoreComments: 是否忽略注释的缩进。设置为 false 表示不忽略注释的缩进。
      }],
      // ignoredNodes: 列表中的节点将被忽略，不会应用缩进规则。
      // JSXElement: JSX 元素。
      // JSXElement > *: JSX 元素的所有子节点。
      // JSXAttribute: JSX 属性。
      // JSXIdentifier: JSX 标识符。
      // JSXNamespacedName: JSX 命名空间名称。
      // JSXMemberExpression: JSX 成员表达式。
      // JSXSpreadAttribute: JSX 展开属性。
      // JSXExpressionContainer: JSX 表达式容器。
      // JSXOpeningElement: JSX 开始标签。
      // JSXClosingElement: JSX 结束标签。
      // JSXFragment: JSX 片段。
      // JSXOpeningFragment: JSX 片段开始标签。
      // JSXClosingFragment: JSX 片段结束标签。
      // JSXText: JSX 文本。
      // JSXEmptyExpression: JSX 空表达式。
      // JSXSpreadChild: JSX 展开子节点。
      
      /** 配置JSX语法的代码缩进 */
      'react/jsx-indent': ["error", 2],
      'react/jsx-indent-props': ["error", 2]
    }
  },
  {
    ignores: [
      'config/',
      'build/',
      'public/',
      'scripts/',
      'mock/',
      '.vscode/',
      'src/utils/XMLToJson.js',
      '**/*.test.js'
    ]
  }
];